﻿package com.webdesign.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import com.opensymphony.xwork2.ActionContext;

/*
 * 解压缩zip文件
 */
public class UnZipUtil {
	public Boolean unZipFiles(String homeworkid,File upFile,String upfileFileName)throws IOException{ 
		/*
		 * upfile,上传的文件
		 * upfileName,上传的文件名
		 * filesum,作业总文件夹爱
		 * fileid,作业号文件夹
		 * force,学生作业解压缩文件夹
		 */
		
		File filesum = null;
		File fileid = null;
		File force = null;
		//rarmsg，解压缩rar文件提示信息，布尔值，为true表示解压缩成功，为false表示解压缩失败
		Boolean rarmsg = false;
		//获取服务器classess路径
		String root = this.getClass().getResource("/").getFile().toString();
		//获取WebDesign路径
		String rt[] = root.split("/WEB-INF");
		String r[] = rt[0].split("");
		//homeworkid,作业号,格式,学期_作业号
		//根据_分解作业号
		String id[] = homeworkid.split("_");
		
		Map<String, Object> session = ActionContext.getContext().getSession();
		//userid,学号
		String userid = (String)session.get("userid");
		
		//根据.分解压缩文件名
		String zipp[] = upfileFileName.split("\\.");
		//如果是zip结尾的文件
		if(zipp[1].equalsIgnoreCase("zip")){
		//在WebDesign路径下新建homework文件
			filesum = new File(rt[0] + "\\homework");
	        if(!filesum.exists()){ 
	        	filesum.mkdirs(); 
	        } 
	        //在homework文件下新建homeworkX文件，X代表作业序号
			fileid = new File(filesum + "\\homework" + id[1]);
	        if(!fileid.exists()){ 
	        	fileid.mkdirs(); 
	        } 
	        ZipFile zip = new ZipFile(upFile); 
	        //循环，将每个文件夹里的内容都解压出来
	        for(Enumeration entries =zip.entries(); 
	                entries.hasMoreElements();){ 
	            ZipEntry entry = (ZipEntry)entries.nextElement(); 
	            //zipEntryName的格式为压缩文件名/其他子文件或者文档，解压时逐层深入解开
	            String zipEntryName = entry.getName(); 
	            //获得输入流
	            InputStream in = zip.getInputStream(entry); 
	            File file = null;
	            //newzipname解压后的文件夹名字
	            String newzipname = userid + "_" +id[1];
	            String str[] = zipEntryName.split("/");   
	            force = new File(fileid + "\\" + newzipname);
	            if(!force.exists()){ 
	            	System.out.println("BBB");
	            	force.mkdirs(); 
	            } 
	            int length = str.length;
	            //获取最底层文件类型，判断是文件夹，还是文档
	            String testr = str[length-1];
	            //"."在java中具有特殊意义，必须使用转义符
	            String nestr[] = testr.split("\\.");
	            if(nestr.length >= 2){
	            	String filestr = newzipname;
	            	//如果是文档，则放在上一层文件夹下，不用再以这个文档名新建文件夹
	            	for(int j=0;j<=length-2;j++){
	            		filestr = filestr + "\\"  + str[j];
	            	}
	            	file = new File(filesum + "\\homework" + id[1] + "\\" + filestr);
	            }
	            //如果是文件夹，则以该文件夹名新建文件夹
	            else{
	            	 file = new File(filesum + "\\homework" + id[1] + "\\" + newzipname + "\\" + zipEntryName);
	            }
	            //输出路径
	            String outPath = filesum + "\\homework" + id[1] + "\\" + newzipname + "\\" + zipEntryName;
	            //判断路径是否存在,不存在则创建文件路径 
	            if(!file.exists()){ 
	                file.mkdirs(); 
	            } 
	            //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压 
	           if(new File(outPath).isDirectory()){ 
	                continue; 
	            } 
	           //如果不是文件夹，则需要解压并以流形式写入
	            OutputStream out = new FileOutputStream(outPath); 
	            byte[] buf1 = new byte[1024]; 
	            //len,字节长度
	            int len; 
	            while((len=in.read(buf1))>0){ 
	                out.write(buf1,0,len); 
	            } 
	            in.close(); 
	            out.close(); 
	            } 
	        return true;
		}
		else if(zipp[1].equalsIgnoreCase("rar")){
			UnRarUtil ur = new  UnRarUtil();
			try {
				rarmsg = ur.unrar(homeworkid,upFile);
			} catch (Exception e) {
				e.printStackTrace();
			}
			if(rarmsg){
				return true;
			}
			else
			{
				return false;
			}
			
		}
		else{
			return false;
		}
    }

}
	
